﻿using I3.AgenteIA.Aplicacao;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using I3.AgenteIA.Aplicacao.DTOs;
using I3.AgenteIA.Dominio.Gramatica;
using Moq;
using System.Collections.Generic;
using I3.AgenteIA.Dominio;

namespace I3.AgenteIA.Aplicacao.Teste
{
    
    
    /// <summary>
    ///This is a test class for AnalisarProcessamentoMorfologicoTest and is intended
    ///to contain all AnalisarProcessamentoMorfologicoTest Unit Tests
    ///</summary>
    [TestClass()]
    public class AnalisarProcessamentoMorfologicoTest
    {

        [TestMethod]
        public void ObterSinteseDoProcessamentoTest_Caso1()
        {
            // Declara as variaveis auxiliares do teste
            string oracao = "";
            SinteseMorfologicaDTO esperadoDTO = new SinteseMorfologicaDTO()
            {
                Oracao = oracao, QtdeDeOracoes = 0, QtdeDeSentencas = 0, QtdeDeElementos = 0
            };

            ObterSinteseDoProcessamento_Execucao(oracao, new List<Sentenca>(), new List<Elemento>(), esperadoDTO);
        }

        [TestMethod]
        public void ObterSinteseDoProcessamentoTest_Caso2()
        {
            // Declara as variaveis auxiliares do teste
            string oracao = null;
            SinteseMorfologicaDTO esperadoDTO = new SinteseMorfologicaDTO()
            {
                Oracao = oracao,
                QtdeDeOracoes = 0,
                QtdeDeSentencas = 0,
                QtdeDeElementos = 0
            };

            ObterSinteseDoProcessamento_Execucao(oracao, new List<Sentenca>(), new List<Elemento>(), esperadoDTO);
        }

        [TestMethod]
        public void ObterSinteseDoProcessamentoTest_Caso3()
        {
            // Declara as variaveis auxiliares do teste
            string oracao = "Frase de teste! dividida em duas partes";
            SinteseMorfologicaDTO esperadoDTO = new SinteseMorfologicaDTO() { Oracao = oracao, QtdeDeOracoes = 1, QtdeDeSentencas = 2, QtdeDeElementos = 8 };

            List<Sentenca> sentencas = new List<Sentenca>(new Sentenca[] { new Mock<Sentenca>().Object, new Mock<Sentenca>().Object });
            List<Elemento> elementos = new List<Elemento>(new Elemento[] { new Mock<Elemento>().Object, new Mock<Elemento>().Object, new Mock<Elemento>().Object, new Mock<Elemento>().Object });

            ObterSinteseDoProcessamento_Execucao(oracao, sentencas, elementos, esperadoDTO);
        }

        public void ObterSinteseDoProcessamento_Execucao(string texto, List<Sentenca> sentencas, List<Elemento> elementos, SinteseMorfologicaDTO esperadoDTO)
        {
            // Declara as variaveis auxiliares do teste
            // N.A.

            // Declara os objetos mock do teste
            var oracao = new Mock<Oracao>();
            var oracaoInterpreter = new Mock<IOracaoInterpreter>();
            var sentencaInterpreter = new Mock<ISentencaInterpreter>();
            var elementoInterpreter = new Mock<IElementoInterpreter>();

            // Configura a execução dos métodos mock
            oracao.SetupGet(o => o.Texto).Returns(texto);
            oracaoInterpreter.Setup(o => o.Interpretar(texto)).Returns(oracao.Object);
            sentencaInterpreter.Setup(o => o.Interpretar(oracao.Object)).Returns(sentencas);
            elementoInterpreter.Setup(o => o.Interpretar(It.IsAny<Sentenca>())).Returns(elementos);

            // Realizada a execução do teste
            AnalisarProcessamentoMorfologico analisarProcessamentoMorfologico = new AnalisarProcessamentoMorfologico(oracaoInterpreter.Object, sentencaInterpreter.Object, elementoInterpreter.Object);
            SinteseMorfologicaDTO retornoDTO = analisarProcessamentoMorfologico.ObterSinteseDoProcessamento(texto);

            // Realiza os assets dos objetos mocks e variaveis
            Assert.IsNotNull(retornoDTO);
            Assert.AreEqual(esperadoDTO.Oracao, retornoDTO.Oracao);
            Assert.AreEqual(esperadoDTO.QtdeDeOracoes, retornoDTO.QtdeDeOracoes);
            Assert.AreEqual(esperadoDTO.QtdeDeSentencas, retornoDTO.QtdeDeSentencas);
            Assert.AreEqual(esperadoDTO.QtdeDeElementos, retornoDTO.QtdeDeElementos);
        }
    }
}
